package logger.sd.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

/**
 * Esqueleto do leitor de Configuracoes
 * 
 * @author wendell
 * 
 */
public abstract class Configuration {

	protected static Configuration instance = null;
	protected String filename;
	protected Properties config;

	// flag para verificar se o arquivo de config existe
	protected boolean file;

	/**
	 * Construtor
	 * 
	 * @exception IOException
	 */
	protected void readConfigurations(String filename) {
		// Exemplo: filename = "config/LoggerServer.properties";
		this.filename = "config/" + filename + ".properties";
		
		this.file = false;
		File file = new File(filename);
		config = new Properties();

		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);
			config.load(fis);
			fis.close();
			System.out.println("Properties loaded");
			this.file = true;
		} catch (FileNotFoundException e) { 
										
			System.err.println("Arquivo " + filename + " nao encontrado! ");
			System.out
					.println("Iniciando aplicacao com as configuracoes " +
							"padrao\n");

			this.file = false;

		} catch (IOException ex) {
			System.err.println(ex.getMessage());
			ex.printStackTrace();
		}

	}

	/**
	 * Retorna o valor da configuracao. Se o arquivo de configuracao ou a chave
	 * nao existir, retorna o valor 'default'.
	 * 
	 * As classes que herdam desta devem implementar o tratamento para valores
	 * default.
	 * 
	 * @param key
	 *            Chave que sera lida
	 * @return Valor da chave. Valor default: 'default'.
	 */
	protected String getConfig(String key) {
		String value = new String();
		if (file) {
			value = config.getProperty(key, "default");
			int end = value.indexOf(' ');
			
			if (end >= 0) {
				value = value.substring(0, end);
			}
		} else {
			value = "default";
		}
		return value;
	}

	/**
	 * Retorna o nome do arquivo de configuracao
	 * 
	 * @return Nome do arquivo de configuracao
	 */
	public String getFilename() {
		return filename;
	}

	
	public void setFilename(String file) {
		filename = file;
	}

	/**
	 * Configura o nome do arquivo de configuracao
	 * 
	 * @param config
	 *            Nome do arquivo
	 */
	public void setConfig(Properties config) {
		this.config = config;
	}

}
